package com.iflytek.sbd.demo.springflowtest;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @program: springbootdemo
 * @description:
 * @author: 陈英俊
 * @create: 2021-12-23 09:45
 */

/**
 * 为什么需要调用Aware接口, 是因为在spring里面,对象分为容器对象和非容器对象,那么非容器对象如何使用容器对象呢?
 * 我们可以在类里定义一个 容器对象, 然后构建getset方法, 我们使用的时候,可以get获取,但是什么时候set呢?
 * spring设计的时候, 设计的就是隐式的操作, 就是 对象实现 BeanFactoryAware,ApplicationContextAware接口, 这两个接口需要实现的方法其实就是类属性的set方法一致,设计的很巧妙,
 * 隐式的调用其实就是容器在调用, invokeAwareMethods 这个方法就是具体的调用
 */
//BeanFactoryAware, ApplicationContextAware,
public class Apple implements InitializingBean, DisposableBean,BeanFactoryAware, ApplicationContextAware{

    private String name;

    private BeanFactory beanFactory;

    private ApplicationContext applicationContext;

    public Apple() {
        System.out.println("执行   apple的无参构造");
    }


    public String getName() {
        System.out.println("执行   apple.name的get方法");
        return name;
    }

    public void setName(String name) {
        System.out.println("执行   apple.name的set方法");
        this.name = name;
    }


    public BeanFactory getBeanFactory() {
        //       System.out.println("开始执行beanFactory的get方法");
        return beanFactory;
    }

    public void setBeanFactory(BeanFactory beanFactory) {
         System.out.println("执行   apple.setBeanFactory的setBeanFactory(),标识Aware已经回调,地址:"+beanFactory);
        this.beanFactory = beanFactory;
    }

    public void init() {
        System.out.println("执行   initMethod   配置的初始化方法");
    }

    public void destroy1() {
        System.out.println("执行   destroyMethod   配置的销毁方法");
    }


    @PostConstruct
    public void gg() {
        System.out.println("执行   @PostConstruct   标识的初始化方法");
    }

    @PreDestroy
    public void  ff(){
        System.out.println("执行   @PreDestroy   标识的销毁方法");
    }

    public ApplicationContext getApplicationContext() {
        //       System.out.println("开始执行applicationContext的get方法");
        return applicationContext;
    }

    public void setApplicationContext(ApplicationContext applicationContext) {
        System.out.println("执行   apple.setBeanFactory的setApplicationContext,标识Aware已经回调,地址:"+applicationContext);
        this.applicationContext = applicationContext;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "name='" + name + '\'';
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("执行   InitializingBean.afterPropertiesSet初始化方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("执行   DisposableBean   标识的销毁方法");
    }
}
